package com.powerbank.user.service;

import com.powerbank.user.dto.WalletRechargeDTO;
import com.powerbank.user.dto.WalletWithdrawDTO;
import com.powerbank.user.vo.*;

import java.math.BigDecimal;

/**
 * 钱包服务接口
 */
public interface WalletService {

    /**
     * 获取用户钱包信息
     *
     * @param userId 用户ID
     * @return 钱包信息
     */
    WalletInfoVO getUserWallet(Long userId);

    /**
     * 创建钱包充值订单
     *
     * @param userId      用户ID
     * @param rechargeDTO 充值信息
     * @return 支付结果
     */
    PaymentResultVO createRechargeOrder(Long userId, WalletRechargeDTO rechargeDTO);

    /**
     * 处理充值成功回调
     *
     * @param paymentNo 支付流水号
     * @return 是否成功
     */
    boolean processRechargeSuccess(String paymentNo);

    /**
     * 申请提现
     *
     * @param userId      用户ID
     * @param withdrawDTO 提现信息
     * @return 提现结果
     */
    WalletWithdrawResultVO applyWithdraw(Long userId, WalletWithdrawDTO withdrawDTO);

    /**
     * 钱包支付
     *
     * @param userId     用户ID
     * @param amount     支付金额
     * @param orderId    订单ID
     * @param payPassword 支付密码
     * @param description 交易描述
     * @return 是否成功
     */
    boolean walletPayment(Long userId, BigDecimal amount, Long orderId, String payPassword, String description);

    /**
     * 钱包退款
     *
     * @param userId      用户ID
     * @param amount      退款金额
     * @param orderId     订单ID
     * @param description 交易描述
     * @return 是否成功
     */
    boolean walletRefund(Long userId, BigDecimal amount, Long orderId, String description);

    /**
     * 设置支付密码
     *
     * @param userId      用户ID
     * @param payPassword 支付密码
     * @return 是否成功
     */
    boolean setPayPassword(Long userId, String payPassword);

    /**
     * 修改支付密码
     *
     * @param userId         用户ID
     * @param oldPayPassword 旧支付密码
     * @param newPayPassword 新支付密码
     * @return 是否成功
     */
    boolean changePayPassword(Long userId, String oldPayPassword, String newPayPassword);

    /**
     * 验证支付密码
     *
     * @param userId      用户ID
     * @param payPassword 支付密码
     * @return 是否正确
     */
    boolean verifyPayPassword(Long userId, String payPassword);

    /**
     * 获取钱包交易记录
     *
     * @param userId 用户ID
     * @param page   页码
     * @param size   页大小
     * @return 交易记录列表
     */
    PageResult<WalletTransactionVO> getWalletTransactions(Long userId, int page, int size);

    /**
     * 获取钱包统计信息
     *
     * @param userId 用户ID
     * @return 统计信息
     */
    WalletSummaryVO getWalletSummary(Long userId);
}